/*
 * @Author: Fan Dong
 * @Date: 2021-06-24 14:59:53
 * @LastEditors: Fan Dong
 * @LastEditTime: 2021-06-25 17:23:30
 * @Description: 文件描述
 * @FilePath: \learn-typescript\ts\5.静态属性 静态防范 抽象类 多态.ts
 */
//  静态属性 静态方法

// function Person() {
//     this.run1 = function () { };
// }
// Person.name = "哈哈哈"; /*静态属性*/
// Person.run2 = function () {
//     /*静态方法*/
// };
// var p = new Person();
// p.run1();
// Person.run2();  // 静态方法的调用

/*
class Person2 {
  public name: string;
  public age: number = 20;
  // 静态属性
  static sex = "男";
  constructor(name: string) {
    this.name = name;
  }

  run(): void {
    console.log(`${this.name} 在运动`);
  }
  work(): void {
    console.log(`${this.name} 在工作`);
  }

  static print() {
    // 静态方法 没法直接调用类里面的属性
    console.log("静态方法");
    console.log(this.sex);
    console.log(Person2.sex);
    // console.log(this.age); // 错误
  }
}

let p2 = new Person2("李四");
p2.run();
p2.work();

Person2.print();
console.log(Person2.sex);

// 静态方法的实际应用
// $.get("url", function () {});

*/

/*
// 多态：父类定义一个方法不去实现，让继承它的子类去实现  每一个子类有不同的表现
// 多态属于继承
class Animal {
  name: string;
  constructor(name: string) {
    this.name = name;
  }
  eat() {
    // 具体吃什么 不知道 具体吃什么？继承它的子类去实现，每一个子类的表现不一样
    console.log("吃的方法");
  }
}

class Dog extends Animal {
  constructor(name: string) {
    super(name);
  }
  eat() {
    console.log(`${this.name}吃粮食`);
  }
}

class Cat extends Animal {
  constructor(name: string) {
    super(name);
  }
  eat() {
    console.log(`${this.name}吃老鼠`);
  }
}

*/

// ts中的抽象类：它是提供其他继承的基类，不能直接实例化。
// 用 abstract关键字定义抽象类和抽象方法，抽象类中的抽象方法不包含具体实现并且必须在派生中实现
// abstract抽象方法只能放在抽象类里面

// 抽象类和抽象方法用来定义标准 Animal 这个类要求它的子类必须包含eat方法

abstract class Animal {
  name: string;
  constructor(name: string) {
    this.name = name;
  }

  abstract eat(): any; // 抽象方法子类必须实现

  run(){
    console.log('其他方法可以不实现')
  }
}

// let aaa9= new Animal() // 错误 不能直接实例化

class Dog extends Animal {
  constructor(name: string) {
    super(name);
  }
  eat() {
    console.log(this.name + "吃粮食");
  }
  run (){
    console.log(this.name + "run");
  }
}

let dd = new Dog("小花");
dd.eat()
dd.run()


// 会报错
// class Cat extends Animal {
//   constructor(name: string) {
//     super(name);
//   }
// }
